﻿/*
 * Crée par SharpDevelop.
 * Utilisateur: eldunkerquois
 * Date: 11/07/2011
 * Heure: 17:02
 * 
 * Pour changer ce modèle utiliser Outils | Options | Codage | Editer les en-têtes standards.
 */
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Web.Services;

using Db4objects.Db4o;
using Db4objects.Db4o.CS;
using openxml.butter.controller;
using openxml.butter.definition;

namespace OpenXmlBetterWebTest.service
{
	/// <summary>
	/// Description of WebService1
	/// </summary>
	[WebService
	 (	Name = "OpenXml Butter Service",
	  Description = "Babar Studio Service",
	  Namespace = "http://studio.stoockies.net/service/openxmlbutter"
	 )
	]
	public class WebService1 : WebService
	{
		private IObjectServer _server;
		private IObjectContainer _db;
		
		#region Start/End
		/// <summary>
		/// Contructeur ouvrant la db connexion
		/// </summary>
		public WebService1()
		{
			Console.WriteLine("new Webservice1");
			string filePath = ConfigurationManager.AppSettings["DatabaseFileName"];
			
			try
			{
				//ouvrir le serveur
				_server = Db4oClientServer.OpenServer(filePath, 0);
				Console.WriteLine("Server ouvert");
				
				try
				{
					//ouvrir la base de données
					_db = _server.OpenClient();
					Console.WriteLine("Client ouvert");
					
				}
				catch (Exception excp )
				{
					Console.WriteLine("Pb lors de l'ouverture client : {0} ", excp.Message );
					_server.Close();
					_server = null;
				}
			}
			catch (Exception excp2 )
			{
				Console.WriteLine("Impossiblie d'ouvrir le server :{0}",excp2.Message ) ;
			}
		}
		
		/// <summary>
		/// Dispose ferme la connexion
		/// </summary>
		/// <param name="disposing"></param>
		protected override void Dispose(bool disposing)
		{
			base.Dispose(disposing);
			Console.WriteLine("Fin du service");
			if ( _server != null )
			{
				try
				{
					if ( _db != null )
					{
						_db.Close();
						_db = null;
						Console.WriteLine("Client fermé" );
					}
				}
				catch (Exception excp )
				{
					Console.WriteLine("Pb de fermeture client : {0}",excp.Message );
				}
				finally
				{
					_server.Close();
					_server = null;
					Console.WriteLine("server fermé!" );
				}
			}
			
		}
		
		#endregion
		
		#region Query
		[WebMethod(Description="Liste des associations Control-DataItem d'un modèle de document")]
		public List<DataControlAssociation> getDocumentAssociations( String code )
		{
			List<DataControlAssociation> assos = DataFactory.Instance.getDocumentAssociations( _db , code );
			Console.WriteLine("nb assos : " + assos.Count ) ;
			
			return assos;
		}
		
		[WebMethod(Description="Liste des modèles de données")]
		public List<DataTemplate> getDataTemplates()
		{
			List<DataTemplate> liste =DataFactory.Instance.get<DataTemplate>( _db );
			
			Console.WriteLine("nb tpls : " + liste.Count ) ;
			
			
			return liste;
		}
		
		[WebMethod(Description="Un modèle de données")]
		public DataTemplate getDataTemplate( String code)
		{
			
			DataTemplate dt =DataFactory.Instance.loadDataTemplate( _db, code );
			if ( dt != null )
			{				
				Console.WriteLine("Data Template dont le code est '{0}' ", code ) ;
			}
			else
			{
				Console.WriteLine("Pas de data template '{0}'" , code ) ;
			}
			
			return dt;
		}
		
		[WebMethod(Description="Données d'un modèle de données")]
		public List<DataItem> getDataTemplateItems( String code )
		{
			List<DataItem> items = DataFactory.Instance.getDataTemplateItems( _db , code );
			Console.WriteLine("nb data items : " + items.Count ) ;
			return items;
		}
		
		[WebMethod(Description="Liste des modèles de données associés au modèle de document")]
		public List<DataTemplate> getDocumentDataTemplates( String code )
		{
			List<DataTemplate> tpls = DataFactory.Instance.getDocumentDataTemplates( _db , code ) ;
			Console.WriteLine( "NB de tpls = " + tpls.Count );
			return tpls ;
		}
		
		[WebMethod(Description="Liste des modèles de documents")]
		public DocumentTemplate[] getDocumentTemplates()
		{
			List<DocumentTemplate> liste = DataFactory.Instance.get<DocumentTemplate>(_db );
			Console.WriteLine("nb tpls : " + liste.Count ) ;
			
			
			DocumentTemplate[] docTemplates = new DocumentTemplate[liste.Count];
			return liste.ToArray();
			
			//return newliste;
		}
		
		
		[WebMethod(Description="Un modèle de de document")]
		public DocumentTemplate getDocumentTemplate( String code)
		{
			DocumentTemplate doc = DataFactory.Instance.get<DocumentTemplate>( _db , code );
			Console.WriteLine("Document Template dont le code est '{0}' : {1}", code,( doc!=null) ) ;
			
			return doc;
		}
		#endregion
		
		#region Associer
		[WebMethod(Description="Associer une donnée à un control")]
		public Boolean associerControlData( String codeDocument , String controlId ,String dataUid )
		{
			try
			{
				DataFactory.Instance.associateControlToData( _db,codeDocument,controlId,dataUid );
				return true;
			}
			catch ( Exception e )
			{
				Console.WriteLine("Pb lors de l'association Control-Donnée :" + e.Message );
				return false ;
			}
		}
		
		[WebMethod(Description="Associer un modèle de données à un modèle de document")]
		public Boolean associerTemplate(String codeDocument , String codeData)
		{
			try
			{
				DataFactory.Instance.associateTemplate( _db , codeDocument , codeData );
				return true;
			}
			catch (Exception e)
			{
				Console.WriteLine("Impossible d'associer les données au modèle de document : " + e.Message );
				return false;
			}
		}
		
		#endregion
		
		
		#region Create
		[WebMethod(Description="Créer un data item au sein d'un data template")]
		public DataItem createDataItem( String code, String description, String exemple , String dataTemplateCode )
		{
			DataItem item = DataFactory.Instance.createDataItem( _db, code , description , exemple , dataTemplateCode );
			Console.WriteLine("Data Item Créé");
			return item ;
		}
		
		
		[WebMethod(Description="Créer un datatemplate, le code doit être unique")]
		public DataTemplate createDataTemplate(String code , String description )
		{
			
			try
			{
				DataTemplate dt = DataFactory.Instance.createTemplate<DataTemplate>( _db, code , description );
				Console.WriteLine("Data Template Créé");
				return dt;
			}
			catch (Exception e)
			{
				Console.WriteLine(e.Message) ;
				return null;
			}
			
		}
		
		[WebMethod(Description="Créer un documenttemplate, le code doit être unique")]
		public DocumentTemplate createDocumentTemplate(String code , String description )
		{
			
			try
			{
				DocumentTemplate dt = DataFactory.Instance.createTemplate<DocumentTemplate>( _db, code , description );
				Console.WriteLine("Document Template Créé");
				return dt;
			}
			catch (Exception e)
			{
				Console.WriteLine(e.Message) ;
				return null;
			}
			
		}
		
		#endregion
		
	}
}
